home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / shell / tokei4 / src / main.c < prev    next >
Text File  |  1995-08-14  |  14KB  |  515 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <egb.h>
  9. #include <guidbg.h>
  10.  
  11. char    *guiEgbPtr ;            /*    EGB のワークアドレス    */
  12.  
  13. /*    どうさに最低必要なメモリ(この例では128Kbytes)    */
  14. #define MimMemory (1024*128)
  15. // #define DEBUG
  16.  
  17. /*    alertMemFunc関数の追い越し禁止フラグ    */
  18. static int        alertMemFlag = FALSE ;
  19.  
  20. /*    アラートメッセージ                        */
  21. static char    *alertStrMem[] =
  22.                 {"時計ー:\nメモリが不足しています", "確認"};
  23.  
  24. /****************************************************************/
  25. /*    メモリ不足時のアラート関数(イベント登録関数)                */
  26. /****************************************************************/
  27. void alertMemFunc()
  28. {
  29.     /*    メモリ不足のアラート表示    */
  30.     MMI_CallMessage(MMI_GetApliId(), GM_ALERT, 
  31.                         AM_ALERT1 | AM_ALERTB0E,(int)alertStrMem) ;
  32.  
  33.     /* alertMemFunc関数の追い越し禁止解除    */
  34.     alertMemFlag = FALSE ;
  35. }
  36.  
  37. extern int    iconBaseWindowID ;
  38. extern int    iconMenuID[] ;
  39. extern int    iconMenuItemID[] ;
  40. extern int    dialogBaseHyperID ;
  41. extern int    iconBaseHyperID ;
  42. extern int    timeSetMessageID[];
  43.  
  44. #include <eintm.h>
  45. #include <mos.h>
  46. #include <smsg.h>
  47. #define T4GDATASIZE (7480)
  48. extern int    t4QuitFuncRet ;
  49. extern int    t4UpdateFlag ;//-1:アップデート不可 0:アップデート可 1:一時強制全アップデート
  50. extern int    t4Hour[];        //タイマー時刻(時)
  51. extern int    t4Minute[];        //タイマー時刻(分)
  52. extern int    t4Switch[];        //スイッチの状態 0:解除 1:設定
  53. extern char    t4GBuffer[];    //グラフィックデータバッファ
  54. extern int    t4x,t4y;        //座標
  55. extern int    t4SMSGFlag;        //0:常駐していない 1:常駐している
  56. extern char    t4MenuMessage[3][11];
  57. extern char sBufS[6][7];
  58. extern int    t4ClipFlag;
  59. int            t4mode = 0;        //モード 0:のびている 1:ちじんでいる
  60.  
  61. extern void t4PreScreenChangeFunc(void);
  62. extern void t4PostScreenChangeFunc(void);
  63. extern void t4IdleTask(void);
  64.  
  65. /*= リジューム用設定=================================================*/
  66. FRAME    RSM_FRAME;
  67. int        RSM_SWITCH[5] ={ 0,0,0,0,0} ;
  68. int        RSM_HOUR[3] =  { 13,16, 1};
  69. int        RSM_MINUTE[3] ={ 54,59,30};
  70. char    RSMID[]="%%% 時計ー %%%";
  71. char    RSMTITLE[]="時計ー    Programmed by 機拡";
  72. /*===================================================================*/
  73.  
  74. //==========================================================================
  75. int userFunc(apliId, messId, info, data)
  76. int    apliId;
  77. int    messId;
  78. int    info;
  79. int    data;
  80. {
  81.     register int    ret;
  82.  
  83.     ret = ILLEGAL_FUNCTION;
  84.  
  85.     switch(messId)
  86.     {
  87.         case    GM_QUIT :
  88. //            extern int iconMenuItemID[] ;
  89. //            MMI_SendMessage( iconMenuItemID[5], MM_EXEC, 2, 0, 0 );
  90.             MMI_SetHaltFlag( TRUE );
  91.             t4QuitFuncRet = NOERR;
  92.  
  93.             ret = t4QuitFuncRet ;
  94.             break;
  95.         /*    アプリケーションを終了する場合はNOERRを、
  96.             アプリケーションを終了しない場合はILLEGAL_FUNCTIONを返す
  97.             (この例では、exit_idonIdの呼び出し関数で、exitFuncRetの値をきめて、
  98.             その値が戻り値になる)    */
  99.  
  100.         /*    どっかから制御が来た    */
  101.         case    GM_WAKE :
  102.          {
  103.              EVENT ev;
  104.  
  105.             /*    alertMemFunc関数の追い越し禁止判定            */
  106.             if(alertMemFlag != FALSE)
  107.                 break ;
  108.  
  109.             /*    動作メモリのチェック    */
  110.             if(TL_checkMemory(1) * 4096 < MimMemory )    
  111.             {
  112.                 /*    alertMemFunc関数の追い越し禁止    */
  113.                 alertMemFlag = TRUE ;
  114.  
  115.                 /*    メモリ不足の場合はアラート処理関数をイベント登録する    */
  116.                 MMI_FlushEvnt() ;    /*    イベントキューをフラッシュ    */
  117.                 ev.what = EVEXEC ;
  118.                 ev.shift = 0 ;
  119.                 ev.info = (int)alertMemFunc ;
  120.                 ev.time  = MOS_getTime() ; 
  121.                 MMI_SetEvnt(&ev) ;
  122.                 break ;
  123.             }
  124.             if(t4mode==1){
  125.                 t4mode = 0;
  126.                 MMI_SendMessage( iconBaseHyperID , MM_ERASE , 0);
  127.                 MMI_SendMessage( dialogBaseHyperID , MM_ERASE , 0);
  128. //                MMI_SendMessage( aboutDialogID , MM_ERASE , 0);
  129.                 //ウィンドゥをのばす
  130.                 FRAME fr;
  131.                 EIN_getObjectFrame(iconBaseWindowID,&fr);
  132.                 fr.rdwy = fr.rdwy + 23 ;
  133.                 MMI_SendMessage(iconBaseWindowID,MM_MOVE,1,&fr);
  134.                 //のばした所にメニューを表示
  135.                 MMI_SendMessage(iconMenuID[0],MM_ATTACH,1,iconBaseWindowID);
  136.                 MMI_SendMessage( iconBaseHyperID ,MM_SHOW , 0);
  137.                 MMI_SendMessage( dialogBaseHyperID , MM_SHOW , 0);
  138.             }
  139.             t4UpdateFlag = 1;
  140.             break ;
  141.         }
  142.         /*    GM_WAKEでは、シェル呼び出し関数の戻り値は
  143.             常にILLEGAL_FUNCTIONにすること(普通はswitch文の前で、
  144.             設定してあるから、処理が終わった段階でbreakしてよい)    */
  145.  
  146.         case    GM_SLEEP :
  147.             #ifdef DEBUG
  148.             printf("時計ー(GM_SLEEP)\n");
  149.             #endif
  150.             if(t4mode==0){
  151.                 t4mode=1;
  152.                 MMI_SendMessage( iconBaseHyperID , MM_ERASE , 0);
  153.                 MMI_SendMessage( dialogBaseHyperID , MM_ERASE , 0);
  154.                 //ウィンドゥをちじめる
  155.                 FRAME fr;
  156.                 EIN_getObjectFrame(iconBaseWindowID,&fr);
  157.                 fr.rdwy = fr.rdwy - 23 ;
  158.                 MMI_SendMessage(iconBaseWindowID,MM_MOVE,1,&fr);
  159.                 //メニューをはずす
  160.                 MMI_SendMessage(iconMenuID[0],MM_DETACH,0);
  161.                 MMI_SendMessage( iconBaseHyperID ,MM_SHOW , 0);
  162.                 MMI_SendMessage( dialogBaseHyperID , MM_SHOW , 0);
  163.             }
  164.             t4UpdateFlag = 1;
  165.             break;
  166.  
  167.         case    GM_PAUSE :
  168.             t4UpdateFlag = -1; //    アップデート禁止
  169.             break;
  170.  
  171.         case    GM_CONTINUE :
  172.             t4UpdateFlag = 0 ; //    アップデート許可
  173.             break;
  174.  
  175. //        case    GM_ENVIRONMENT :
  176. //            if(info)
  177. //                environmentPopFunc(); /*環境復帰処理関数(ユーザーが設定)*/
  178. //            else
  179. //                environmentPushFunc(); /*環境退避処理関数(ユーザーが設定)*/
  180. //            ret = NOERR;
  181. //            break;
  182.         /*    GM_ENVIRONMENTの時、環境退避をする場合はNOERRを、
  183.             そうでない場合はILLEGAL_FUNCTIONを(普通はswitch文の前で
  184.             設定してあるから、処理が終わった段階でbreakしてよい)返す    */
  185.  
  186.         case    GM_PRESCRCHG :
  187.             t4PreScreenChangeFunc();
  188.             break;
  189.  
  190.         case    GM_POSTSCRCHG :
  191.             t4PostScreenChangeFunc();
  192.             break;
  193.  
  194.         case    GM_SHOW :
  195.             t4UpdateFlag = 1;    //一時強制全アップデート
  196.             #ifdef DEBUG
  197.             printf("時計ー(GM_SHOW):強制アップデート");
  198.             #endif
  199.             break;
  200.  
  201.         case    GM_ERASE :
  202.             t4UpdateFlag = -1;    //アップデート禁止
  203.             break;
  204.  
  205.         default : break;
  206.     }
  207.  
  208.     return(ret);
  209. }
  210.  
  211. void main()
  212. {
  213.     static MMICTRL mmi ={
  214.                 SCREEN16 | SCREENIGNORE,    // ページ0側解像度
  215.                 SCREENUNUSED,                // ページ1側解像度
  216.                 0,                             // 書き込みページ
  217.                 SCREENAVAILABLE,             // 表示ページ
  218.                 0,                             // 表示プライオリティ
  219.                 SCREENAVAILABLE,            // 色数
  220.                 SCREENEXPAND,                 // VRAMの横の長さ
  221.                 0,                             // メモリ領域の大きさ
  222.                 NULL,                         // メモリ領域のアドレス
  223.                 0,                             // ユーザ領域の大きさ
  224.                 NULL,                         // ユーザ領域のアドレス
  225.                 0, 0,                         // 画面枠    lupx,lupy
  226.                 0, 0,                        //            rdwx,rdwy
  227.                 -16384, -16384,                // 移動枠    lupx,lupy
  228.                 16383, 16383,                //            rdwx,rdwy
  229.                 15,                         // 白色
  230.                 8,                          // 黒色
  231.                 7,                          // 灰色
  232.                 6                             // 反転色
  233.     };
  234.  
  235.     extern int APL_init() ;
  236.     extern int APL_end() ;
  237.  
  238.     /*    初期化処理    */
  239.     if (MMI_Open( &mmi ) == NOERR)
  240.     {
  241.         /*    初期化に成功すればメインループに入る.    */
  242.         if (APL_init() == NOERR){
  243.             MMI_ExecSystem() ;
  244.             APL_end();
  245.         }
  246.     }
  247.  
  248.     /*    終了処理    */
  249.     MMI_Close() ;
  250.  
  251. }
  252.  
  253. int APL_init()
  254. {
  255.     extern MMIINIT    initDataICONGUI ;
  256.     extern MMIINIT    initDataABOUTGUI ;
  257.     extern MMIINIT    initDataT_SETGUI ;
  258.  
  259.     register int    ret ;
  260.  
  261.     /*    EGB ワークアドレスの取得.    */
  262.     guiEgbPtr = MMI_GetEgbPtr() ;
  263.  
  264.     /*    ハイパ型部品の初期化            */
  265.     if ((ret = MMI_initHyper()) < 0)
  266.         return ret ;
  267.     /*    ダイアログ型部品の初期化        */
  268.     if ((ret = MMI_initDialogL40()) < 0)
  269.         return ret ;
  270.     /*    ウインドウ型部品の初期化        */
  271.     if ((ret = MMI_initWindowL40()) < 0)
  272.         return ret ;
  273.     /*    メッセージ型部品の初期化        */
  274.     if ((ret = MMI_initMessageL40()) < 0)
  275.         return ret ;
  276.     /*    メニュー型部品の初期化            */
  277.     if ((ret = MMI_initMenuL40()) < 0)
  278.         return ret ;
  279.     /*    ボタン型部品の初期化            */
  280.     if ((ret = MMI_initButtonL40()) < 0)
  281.         return ret ;
  282.     /*    ドロウボタン型部品の初期化        */
  283.     if ((ret = MMI_initDrawButtonL40()) < 0)
  284.         return ret ;
  285.     /*    アイコンボタン型部品の初期化    */
  286.     if ((ret = MMI_initIconL40()) < 0)
  287.         return ret ;
  288.     /*    メニューアイテム型部品の初期化    */
  289.     if ((ret = MMI_initMenuItemL40()) < 0)
  290.         return ret ;
  291.     /*    スクロール型部品の初期化        */
  292.     if ((ret = MMI_initScrollBarL40()) < 0)
  293.         return ret ;
  294.  
  295.     /*    背景データの初期化                        */
  296.  
  297.     /*    データの登録        */
  298.     if ((ret = MMI_Init(&initDataICONGUI)) < 0)
  299.         return ret ;
  300.  
  301.     if ((ret = MMI_Init(&initDataABOUTGUI)) < 0)
  302.         return ret ;
  303.  
  304.     if ((ret = MMI_Init(&initDataT_SETGUI)) < 0)
  305.         return ret ;
  306.  
  307.     MMI_SendMessage(MMI_GetBaseObj(), MM_SETEXEC, 1, userFunc);
  308.     MMI_CallMessage(MMI_GetApliId(), GM_TITLE, (int)RSMTITLE, 0);
  309.  
  310.     // GUI色をメニュー色に設定
  311.     KH_initGuiColor();
  312.  
  313.     //===============================================================
  314.     //                    リジューム読み込み
  315.     //===============================================================
  316.     char    work[RSMWORKSIZE];    // リジュームマネージャのワークエリア
  317.     char    buf[300];
  318.     char    *ptr;
  319.     int        size, x, y,i,j;
  320.     FRAME fr;
  321.     EIN_getObjectFrame(iconBaseWindowID,&fr);
  322.  
  323.     // リジュームマネージャの初期化(アプリのIDタグ登録)
  324.     EIN_rsmInit( work, RSMID );
  325.     // 読み込みバッファ設定
  326.     EIN_rsmBufSet( work, buf, 1023 );
  327.     // リジューム情報読み込み
  328.     size = EIN_rsmLoad( work );
  329.     #ifdef DEBUG
  330.     printf("時計ー:resume size=%d\n",size);
  331.     #endif
  332.     if ( size > 0 ){
  333.         //アイコン表示位置
  334.         if( ((ptr = strstr(buf,"\nICON: ")) != NULL ) &&
  335.                     (sscanf(ptr,"\nICON: %d %d\n",&x,&y) > 1 ) ){
  336.             RSM_FRAME.lupx = x;
  337.             RSM_FRAME.lupy = y;
  338.             RSM_FRAME.rdwx = x+(fr.rdwx-fr.lupx);
  339.             RSM_FRAME.rdwy = y+(fr.rdwy-fr.lupy);
  340.             #ifdef DEBUG
  341.             printf("時計ー(ICON): move to (%d,%d)\n",x,y);
  342.             #endif
  343.             MMI_SendMessage(iconBaseWindowID,MM_MOVE,1,&RSM_FRAME);
  344.         }
  345.         //タイマー時刻
  346.         if( ((ptr = strstr(buf,"\nTIMER: ")) != NULL ) &&
  347.                     (sscanf(ptr,"\nTIMER: %d:%d %d:%d %d:%d\n",
  348.                         &(RSM_HOUR[0]),&(RSM_MINUTE[0]),
  349.                         &(RSM_HOUR[1]),&(RSM_MINUTE[1]),
  350.                         &(RSM_HOUR[2]),&(RSM_MINUTE[2]) ) > 1 ) ){
  351.             for(i=0;i<3;i++){
  352.                 t4Hour[i]=RSM_HOUR[i];
  353.                 t4Minute[i]=RSM_MINUTE[i];
  354.             }
  355.             #ifdef DEBUG
  356.             printf("時計ー(TIMER): %d:%d %d:%d %d:%d\n",
  357.                                 RSM_HOUR[0],RSM_MINUTE[0],
  358.                                 RSM_HOUR[1],RSM_MINUTE[1],
  359.                                 RSM_HOUR[2],RSM_MINUTE[2] );
  360.             #endif
  361.         }
  362.         //スイッチ状態
  363.         if( ((ptr = strstr(buf,"\nSWITCH: ")) != NULL ) &&
  364.                     (sscanf(ptr,"\nSWITCH: %d %d %d %d %d\n",&(RSM_SWITCH[0]),
  365.                         &(RSM_SWITCH[1]),&(RSM_SWITCH[2]),
  366.                         &(RSM_SWITCH[3]),&(RSM_SWITCH[4])) > 1 ) ){
  367.             for(i=0;i<5;i++) t4Switch[i]=RSM_SWITCH[i];
  368.             #ifdef DEBUG
  369.             printf("時計ー(SWITCH): %d %d %d %d %d\n",RSM_SWITCH[0],
  370.                         RSM_SWITCH[1],RSM_SWITCH[2],
  371.                         RSM_SWITCH[3],RSM_SWITCH[4]);
  372.             #endif
  373.         }
  374.     } else { ;
  375.     #ifdef DEBUG
  376.     printf("時計ー:Can't find resume file.\n");
  377.     #endif
  378.     }
  379.  
  380.     //サウンドメッセージ初期化
  381.     //しなくてよい?(サウンドワークがわからないから、初期化できない)
  382.     if( SMSG_chk() == 0 ){
  383.         t4SMSGFlag = 0;
  384.         #ifdef DEBUG
  385.         printf("時計ー:サウンドメッセージ常駐なし\n");
  386.         #endif
  387.     } else {
  388.         t4SMSGFlag = 1;
  389.         #ifdef DEBUG
  390.         printf("時計ー:サウンドメッセージ常駐あり\n");
  391.         #endif
  392.     }
  393.  
  394.     //タイマー時刻をメニューと、ボタンに書き込む
  395.     for(i=0;i<3;i++){
  396.         sprintf(&(t4MenuMessage[i][0]),"%2d時 %2d分",t4Hour[i],t4Minute[i]);
  397.         sprintf(&(sBufS[i*2][0]),"%2d時",t4Hour[i]);
  398.         sprintf(&(sBufS[i*2+1][0]),"%2d分",t4Minute[i]);
  399.         MMI_SendMessage(iconMenuItemID[i+6],MM_SETMSG,1,
  400.                                             &(t4MenuMessage[i][0]));
  401.         MMI_SendMessage(timeSetMessageID[i*2+1],MM_SETMSG,1,
  402.                                             &(sBufS[i*2][0]));
  403.         MMI_SendMessage(timeSetMessageID[i*2+2],MM_SETMSG,1,
  404.                                             &(sBufS[i*2+1][0]));
  405.     }
  406.     //スイッチの内容をメニューに反映させる
  407.     for(i=0;i<5;i++){
  408.         if(t4Switch[i] == 1){
  409.             //セット
  410.             MTL_setAtrObj( iconMenuItemID[i+6] , MS_CHECKL40 );
  411.         } else {
  412.             //リセット
  413.             MTL_resetAtrObj( iconMenuItemID[i+6] , ~MS_CHECKL40 );
  414.         }
  415.     }
  416.  
  417.     //グラフィックデータファイルの読み込み
  418.     for(i=0;i<130;i++) buf[i]=0;
  419.     char name[] = "tokei4.dat\0" ;
  420.     MMI_CallMessage(MMI_GetApliId(),GM_QUERYID,QM_DIRECTRY,(int)buf);
  421.     i=0;j=0;
  422.     while(buf[i]!='\0') i++ ;
  423.     while(name[j]!='\0') { buf[i+j] = name[j]; j++;}
  424.     FILE *fp;
  425.     if((fp=EIN_fopen(buf,"rb"))==NULL){
  426.         #ifdef DEBUG
  427.         printf("時計ー:Can't open '%s'.\n",buf);
  428.         #endif
  429.         return -1 ;                        //time4.datが見つからなければ起動しない
  430.     } else
  431.     fread( t4GBuffer , 1, T4GDATASIZE,fp);
  432.     fclose(fp);
  433.  
  434.     EIN_getObjectFrame(iconBaseWindowID,&fr);
  435.     t4PostScreenChangeFunc();
  436.     t4x = fr.lupx + 6;
  437.     t4y = fr.lupy + 4;
  438.  
  439.     t4mode=0;
  440.     MMI_CallMessage( MMI_GetApliId() , GM_SLEEP ,0,0 );
  441.  
  442. //    MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;
  443.     t4UpdateFlag = 1;
  444.     t4ClipFlag = 0;
  445.     MMI_SetIdleTaskFunc( t4IdleTask );
  446.     t4IdleTask();
  447.  
  448.     return NOERR ;
  449. }
  450.  
  451. int APL_end()
  452. {
  453.     //リジューム保存
  454.  
  455.     char    work[RSMWORKSIZE];
  456.     char    buf[300];
  457.     char    aplpath[128];
  458.     FRAME    fr;
  459.     register int ret;
  460.     
  461.     // アイコンの枠座標を得る
  462.     EIN_getObjectFrame(iconBaseWindowID,&fr);
  463.     
  464.     // 情報が更新されていたら保存
  465.     if ( (RSM_FRAME.lupx    != fr.lupx) ||
  466.          (RSM_FRAME.lupy    != fr.lupy) ||
  467.          (RSM_SWITCH[0]        != t4Switch[0]) ||
  468.          (RSM_SWITCH[1]        != t4Switch[1]) ||
  469.          (RSM_SWITCH[2]        != t4Switch[2]) ||
  470.          (RSM_SWITCH[3]        != t4Switch[3]) ||
  471.          (RSM_SWITCH[4]        != t4Switch[4]) ||
  472.          (RSM_HOUR[0]        != t4Hour[0]) ||
  473.          (RSM_HOUR[1]        != t4Hour[1]) ||
  474.          (RSM_HOUR[2]        != t4Hour[2]) ||
  475.          (RSM_MINUTE[0]        != t4Minute[0]) ||
  476.          (RSM_MINUTE[1]        != t4Minute[1]) ||
  477.          (RSM_MINUTE[2]        != t4Minute[2]) ){
  478.         #ifdef DEBUG
  479.         printf("時計ー:リジューム保存\n");
  480.         #endif
  481.         // マネージャ初期化
  482.         EIN_rsmInit( work, RSMID );
  483.         // バッファ設定(アプリ識別ID,更新時刻は自動設定されます)
  484.         EIN_rsmBufSet( work, buf, 1023 );
  485.         // アプリディレクトリ保存
  486.         MMI_CallMessage( MMI_GetApliId(), GM_QUERYID, QM_PATH, (int)aplpath );
  487.         EIN_rsmBufPrintf( work, "APLPATH: %s", aplpath );
  488.         // アプリ名保存
  489.         EIN_rsmBufPrintf( work, "TITLE:   %s", RSMTITLE );
  490.         // コメント保存
  491.         EIN_rsmBufCat( work, "COMMENT: アラーム付きデジタル時計。メニューが引っ込んで小さくなります。");
  492.  
  493.         // アイコン位置保存
  494.         EIN_rsmBufPrintf( work, "ICON: %d %d", fr.lupx, fr.lupy );
  495.         // タイマー保存
  496.         EIN_rsmBufPrintf( work, "TIMER: %d:%d %d:%d %d:%d",
  497.                 t4Hour[0],t4Minute[0],t4Hour[1],t4Minute[1],
  498.                 t4Hour[2],t4Minute[2]);
  499.         // スイッチ状態保存
  500.         EIN_rsmBufPrintf( work, "SWITCH: %d %d %d %d %d",t4Switch[0],
  501.                         t4Switch[1],t4Switch[2],t4Switch[3],t4Switch[4]);
  502.         // バッファ終端(^A)設定
  503.         EIN_rsmBufTail( work );
  504.         // バッファをセーブ
  505.         ret = EIN_rsmSave( work );
  506.  
  507.         #ifdef DEBUG
  508.         printf("時計ー: resume save size %d\n",ret);
  509.         #endif
  510.  
  511.     }
  512.  
  513.     return NOERR ;
  514. }
  515.